classdef TestProductionFunction < matlab.unittest.TestCase

    properties
        OriginalPath
        par
        prod_fun
        prod_fun_cal
        inp
    end

    methods (TestMethodSetup)
        function createFixture(testCase)
            testCase.OriginalPath = path;
            testCase.addTeardown(@path,testCase.OriginalPath);

            addpath('../');
            addpath('../../ProductionFunctions');

            testCase.par =  table2struct(readtable(['../parameters/' ...
                                'production_function_par.csv']));
                            
            testCase.par.scale_L = 278;                
            testCase.prod_fun = ProductionFunction(testCase.par);

            testCase.prod_fun_cal = KrusellRobotsEach(testCase.par);
            testCase.prod_fun_cal.KrusellRobotsEach_use_properties ...
                = 0;
            
            testCase.inp.L_M = 3.190741401000000e+02;
            testCase.inp.L_R = 1.281000506000000e+03;
            testCase.inp.L_C = 7.013808617000000e+02;
            testCase.inp.K_B_M = 6.14;
            testCase.inp.K_B_R = 1.540533022000000e+02;
            testCase.inp.K_B_C = 2.414130601000000e+03;
            testCase.inp.K_E = 1.527652807000000e+04;
            testCase.inp.K_S = 6.907134182000000e+03;

        end
    end

    methods (Test)

        function test_constructor(testCase)
            testCase.prod_fun
        end


        function test_Y(testCase)
            actVal = testCase.prod_fun.Y(testCase.inp);
            expVal = testCase.prod_fun_cal.Y(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end

        function test_constant_returns(testCase)
            actVal = 289 * testCase.prod_fun.Y(testCase.inp);
            
            inp.L_M = 289*testCase.inp.L_M;
            inp.L_R = 289*testCase.inp.L_R;
            inp.L_C = 289*testCase.inp.L_C;
            inp.K_B_M = 289*testCase.inp.K_B_M;
            inp.K_B_R = 289*testCase.inp.K_B_R;
            inp.K_B_C = 289*testCase.inp.K_B_C;
            inp.K_E = 289*testCase.inp.K_E;
            inp.K_S = 289*testCase.inp.K_S;
            
            expVal = testCase.prod_fun_cal.Y(inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-8)
        end

        function test_Y_M(testCase)
            actVal = testCase.prod_fun.Y_M(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_M(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end


        function test_Y_R(testCase)
            actVal = testCase.prod_fun.Y_R(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_R(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end


        function test_Y_C(testCase)
            actVal = testCase.prod_fun.Y_C(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_C(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end


        function test_Y_B_M(testCase)
            actVal = testCase.prod_fun.Y_B_M(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_B_M(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end


        function test_Y_B_R(testCase)
            actVal = testCase.prod_fun.Y_B_R(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_B_R(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end

        function test_Y_B_C(testCase)
            actVal = testCase.prod_fun.Y_B_C(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_B_C(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end


        function test_Y_E(testCase)
            actVal = testCase.prod_fun.Y_E(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_E(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end
        
        
        function test_Y_S(testCase)
            actVal = testCase.prod_fun.Y_S(testCase.inp);
            expVal = testCase.prod_fun_cal.Y_S(testCase.inp);
            testCase.verifyEqual(actVal, expVal, 'AbsTol', 1e-6)
        end           
        
    end

end
